package main

import (
	"fmt"
	"sync"
)

/*
  代理模式
  可以使用在很多地方
  例如网络连接，内存中大的对象，一个文件，或者其他消耗大的对象，或者是不可能被复制的对象。
  简单的例子
*/

// 对象
type IObject interface {
	Do(string)
}

type Object struct {
	action string
}

func (o *Object) Do(action string)  {
    fmt.Println("do " + action)
}

//代理对象
type ProxyObject struct  {
	obj *Object
}

var one sync.Once

func (p *ProxyObject) Do(action string)  {
	one.Do(func() {
		if p.obj == nil {
			p.obj = new(Object)
		}
	})
	p.obj.Do(action)
}


func main() {
	proxy := new(ProxyObject)
	proxy.Do("well")
}
